#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// 根据规格书定义参数
#define SCREEN_WIDTH 128   // OLED宽度（像素）
#define SCREEN_HEIGHT 64   // OLED高度（像素）
#define OLED_ADDR 0x3C     // I2C地址（规格书第8页）
#define SDA_PIN 19         // ESP32默认SDA
#define SCL_PIN 22         // ESP32默认SCL

// 创建OLED对象
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

void setup() {
  Serial.begin(115200);
  
  // 初始化I2C（根据规格书第7页引脚定义）
  Wire.begin(SDA_PIN, SCL_PIN);
  
  // 初始化OLED（规格书第9-10页电气特性）
  if(!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
    Serial.println("OLED初始化失败!");
    while(1); // 停止执行
  }
  Serial.println("OLED初始化成功!");

  // 应用规格书第13页的初始化序列
  display.ssd1306_command(SSD1306_DISPLAYOFF);                    // 0xAE
  display.ssd1306_command(SSD1306_SETDISPLAYCLOCKDIV);            // 0xD5
  display.ssd1306_command(0x80);                                  // 建议值
  display.ssd1306_command(SSD1306_SETMULTIPLEX);                  // 0xA8
  display.ssd1306_command(SCREEN_HEIGHT - 1);                     // 0x3F (64-1)
  display.ssd1306_command(SSD1306_SETDISPLAYOFFSET);              // 0xD3
  display.ssd1306_command(0x00);                                  // 无偏移
  display.ssd1306_command(SSD1306_SETSTARTLINE | 0x00);           // 0x40
  display.ssd1306_command(SSD1306_CHARGEPUMP);                    // 0x8D
  display.ssd1306_command(0x14);                                  // 启用电荷泵
  display.ssd1306_command(SSD1306_MEMORYMODE);                    // 0x20
  display.ssd1306_command(0x00);                                  // 水平寻址模式
  display.ssd1306_command(SSD1306_SEGREMAP | 0x01);               // 0xA1
  display.ssd1306_command(SSD1306_COMSCANDEC);                    // 0xC8
  display.ssd1306_command(SSD1306_SETCOMPINS);                    // 0xDA
  display.ssd1306_command(0x12);                                  // 引脚配置
  display.ssd1306_command(SSD1306_SETCONTRAST);                   // 0x81
  display.ssd1306_command(0xCF);                                  // 对比度值
  display.ssd1306_command(SSD1306_SETPRECHARGE);                  // 0xD9
  display.ssd1306_command(0xF1);                                  // 预充电周期
  display.ssd1306_command(SSD1306_SETVCOMDETECT);                 // 0xDB
  display.ssd1306_command(0x30);                                  // Vcomh电平
  display.ssd1306_command(SSD1306_DISPLAYALLON_RESUME);           // 0xA4
  display.ssd1306_command(SSD1306_NORMALDISPLAY);                 // 0xA6
  display.ssd1306_command(SSD1306_DISPLAYON);                     // 0xAF

  // 显示初始内容
  showWelcomeScreen();
  delay(2000);
}

void loop() {
  // 显示动态文本
  display.clearDisplay();
  displayText("Tempreture: 25.6℃", 0, 10);
  displayText("humidity: 45%", 0, 30);
  
  // 绘制图形元素
  display.drawRect(100, 5, 20, 20, SSD1306_WHITE);  // 外框
  display.fillCircle(110, 15, 5, SSD1306_WHITE);    // 中心点
  display.display();
  
  delay(3000);
  
  // 显示滚动文本
  scrollText("ESP32 OLED presentation - from deepseek", 2);
  enterSleepMode();
  delay(3000);
  exitSleepMode();
}

// 显示欢迎界面
void showWelcomeScreen() {
  display.clearDisplay();
  
  // 绘制标题
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(10, 5);
  display.println("HS96L03W2C03");
  
  // 绘制分隔线
  display.drawLine(0, 30, 127, 30, SSD1306_WHITE);
  
  // 绘制信息
  display.setTextSize(1);
  display.setCursor(0, 35);
  display.println("NO1: 128x64");
  display.setCursor(0, 45);
  display.println("NO2: SSD1306");
  display.setCursor(0, 55);
  display.println("NO3: 0x3C");
  
  display.display();
}

// 显示文本（带自动换行）
void displayText(String text, int x, int y) {
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(x, y);
  display.println(text);
  display.display();
}

// 滚动文本效果
void scrollText(String text, int textSize) {
  display.setTextSize(textSize);
  display.setTextColor(SSD1306_WHITE);
  
  int textWidth = text.length() * 6 * textSize; // 估算文本宽度
  int xPos = SCREEN_WIDTH;
  
  while(xPos > -textWidth) {
    display.clearDisplay();
    display.setCursor(xPos, (SCREEN_HEIGHT - 8 * textSize) / 2);
    display.print(text);
    display.display();
    xPos -= 2; // 滚动速度
    
    delay(20); // 控制滚动速度
  }
}

// 进入睡眠模式（规格书第14页）
void enterSleepMode() {
  display.ssd1306_command(SSD1306_DISPLAYOFF);      // 0xAE
  display.ssd1306_command(SSD1306_CHARGEPUMP);      // 0x8D
  display.ssd1306_command(0x10);                    // 禁用电荷泵
  Serial.println("OLED is entering sleeping mode");
}

// 退出睡眠模式
void exitSleepMode() {f
  display.ssd1306_command(SSD1306_CHARGEPUMP);      // 0x8D
  display.ssd1306_command(0x14);                    // 启用电荷泵
  delay(100);                                       // 等待稳定
  display.ssd1306_command(SSD1306_DISPLAYON);       // 0xAF
  Serial.println("OLED is leaving sleeping mode");
}